package cn.tedu.tmall.basic.service.impl;

import cn.tedu.tmall.basic.dao.persist.repository.IDistrictRepository;
import cn.tedu.tmall.basic.dao.repository.IDistrictCacheRepository;
import cn.tedu.tmall.basic.pojo.po.DistrictPO;
import cn.tedu.tmall.basic.service.IDistrictService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 处理省市区数据的业务实现类
 *
 * @author java@tedu.cn
 * @version 3.0
 */
@Slf4j
@Service("DistrictServiceInitAllImpl")
public class DistrictServiceInitAllImpl implements IDistrictService {

    @Autowired
    private IDistrictRepository districtRepository;
    @Autowired
    private IDistrictCacheRepository districtCacheRepository;

    public DistrictServiceInitAllImpl() {
        log.debug("创建业务类对象：DistrictServiceImpl");
    }

    @Override
    public List<DistrictPO> listByParent(Long parentId) {
        log.debug("开始执行【根据父级查询子级地区列表】的业务，参数：{}", parentId);
        //return districtRepository.listByParent(parentId);
        return districtCacheRepository.listByParent(parentId);
    }

    /**
     * 优点 一次查询数据库
     * 缺点 会占内存 ,我们把所有的数据全查出来
     */
    @Override
    public void initDict() {
        //1 查询所有的数据
        List<DistrictPO> all = districtRepository.listAll();
        if (CollectionUtils.isEmpty(all)){
            log.error("查询省市区信息为空");
            //报警... 通知dba,op,通知领导.(待商榷)
        }else {
            //2 list转换成map ,按照parentId 进行分组
            Map<Long,List<DistrictPO>> result = groupByParent(all);
            //删除redis
            districtCacheRepository.deleteAll();

            //把parentI的0 ,和 districtPOS 存到redis 里 用list结构
            result.forEach((parentId,districtPOS)->
                    districtCacheRepository.saveDict(parentId,districtPOS));
        }
        //throw new RuntimeException("故意抛个异常试试锁会不会释放.");
    }


    private Map<Long,List<DistrictPO>> groupByParent(List<DistrictPO> districtPOS){
        Map<Long,List<DistrictPO>> result = new HashMap<>();
        for (DistrictPO po : districtPOS) {
            Long parentId = po.getParentId();
            //先判断这个pId 是否在map里存在
            if(result.containsKey(parentId)) {
                List<DistrictPO> existList = result.get(parentId);
                existList.add(po);
            }else {
                //第一次 肯定map 是空的
                List<DistrictPO> temp = new ArrayList<>();
                temp.add(po);
                //size 是不是1
                result.put(parentId,temp);
                //map<p_id=0,List<index=0>> 外面那个大list的第一条数据
            }
        }
        return result;
    }







}
